package org.jeecg.modules.common.baseentity;

import com.alibaba.fastjson.JSONObject;
import lombok.Data;

import java.util.List;
import java.util.Map;

@Data
public class Row2ColModelPro {
    // clazzT 类型
    // groupFields 固定分组属性名称
    // groupFieldsAsName 固定分组属性显示别名
    // row2colsKeyFields  行转列动态列对应的关键属性字段，例如：科目字段（值是=语文 英语 数学）
    // row2colsKeyFieldsDict 行转列动态列对应的关键属性字段字典转义
    // newColsValueByFields 行转列动态列对应的值字段，允许空：例如：成绩字段（值是=98.5 99 59.5）
    // newColsValueUnitSymboles 动态列对应的单位符号，允许空，例如：“%” “人” “个”等
    // newColsNullValueByString  //新动态列null值处理默认值
    // groupCalculationColFunAsColName  //聚合函数计算字段、函数、别名：{{*列名，*函数，别名，权重列}}
    // orderColName        //最后排序字段：是按照最后显示的别名排序，显示排序字段值：例如：{{"classOrder","asc","classOrderAsc"},{"className","asc","classNameAsc"},{"classScop","desc","classScopDesc"}}


    // groupCalculationFun  聚聚合计算函数，支持[sum,count,max,min]不区分大小写
    // groupCalculationFunForValueField 聚合函数作用字段，必须是newColsValueByFields中的字段不能是别的字段
    // groupCalculationAsColName 计算值列名字符串=列名+字符串，值=“Calculation”，所得列名=“语文Calculation”
    // newValueWeightCoefficientFieldes  //聚合函数使用的权重系数字段
    // newWeightCoefficientAsColName  //权重系数列名,如果有权重系数没有权重名，则会直接在求和时参与计算但并不会显示


    private Class clazzT;                  //类名
    private String[] groupFields;          //分组属性名
    private String[] groupFieldsAsName;    //分组属性返回别名
    private List<Row2ColGroupBy> groupByList;

    private String[] row2colsKeyFields;    //列名转义字典属性：固定分组列、动态列都有可能是来自字典码
    private Map<String,String>[] row2colsKeyFieldsDict;//列字典转义配置 {"subjectId":"cou_subject,id,subject_name","classroomId":"fac_classroom,id,classroomName"}


    private String[] newColsValueByFields;      //动态列取值，单元格内元素是拼接后的string，默认拼接符号是换行符"\n"，取值：{"teacherId","teacherName","classroomId"} 实际返回值例如：3445676432="张老师\n七一班教室“
    private String[] newColsValueJSONByFields;  //动态列JSON化：单元格内元素是JSON格式，取值：{"teacherId","teacherName","classroomId"} 实际返回值例如：3445676432_JSON={teacherId:"2343",teacherName:"张老师",teacherId_dicttext:"张老师",classroomId:"23466",classroomName:"七一班教室"}
    private String[] newColsValueUnitSymboles = null;  // valueUnits 动态列对应的单位符号，允许空，例如：“%” “人” “个”等
    private String newColsNullValueByString = "-1";  //新动态列null值处理默认值


    private String[][] groupCalculationColFunAsColName = null; //聚合函数计算字段、函数、别名：{{*列名，*函数，别名，权重列}}
//    private String newValueWeightCoefficientFieldes = null; /*取值数据计算求和时候的权重系数，仅仅求和和平均的时候有效，与取值属性valueFields对应*/
//    private String newWeightCoefficientAsColName = null; /*权重系数对应的列名*/

    private String[][] orderColName = null; //最后排序字段：是按照最后显示的别名排序，显示排序字段值：{排序列名，排序方式，排序数值取值字段}，例如：{{"classOrder","asc","classOrderAsc"},{"className","asc","classNameAsc"},{"classScop","desc","classScopDesc"}}

    private int rowCount = 0; //行数量
    private int colCount = 0; //列数量
    private String[] resultColNmaes = null;  //最终结果列名称
    private JSONObject jsonColNmaes = null;  //最终结果列名称JSON格式

    /**
     *
     * @param clazzT 类型，其他属性后期set赋值
     */
    public Row2ColModelPro(Class clazzT){
//        Type types=this.getClass().getGenericSuperclass();
//        Type[] genericType=((ParameterizedType)types).getActualTypeArguments();
//        Class <T> clazz = (Class <T>) ((ParameterizedType) new Entity().getClass().getGenericSuperclass()).getActualTypeArguments()[0];
//        this.clazzT=(Class<T>) genericType[0];

//        this.clazzT = (Class <T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

        this.clazzT = clazzT;
    }
    public Row2ColModelPro(String[] groupFields,String[] row2colsKeyFields,String[] newColsValueByFields){
        this.groupFields = groupFields ;          //分组属性名
        this.row2colsKeyFields = row2colsKeyFields ;
        this.newColsValueByFields = newColsValueByFields;      //动态列取值，单元格内元素是拼接后的string，默认拼接符号是换行符"\n"，取值：{"teacherId","teacherName","classroomId"} 实际返回值例如：3445676432="张老师\n七一班教室“
    }

    /**
     *
     * @param clazzT 类型
     * @param groupFields 固定分组属性名称
     * @param groupFieldsAsName 固定分组属性显示别名
     * @param row2colsKeyFields  行转列动态列对应的关键属性字段，例如：科目字段（值是=语文 英语 数学）
     * @param newColsValueByFields 行转列动态列对应的值字段，允许空：例如：成绩字段（值是=98.5 99 59.5）
     * @param newColsValueUnitSymboles 动态列对应的单位符号，允许空，例如：“%” “人” “个”等
     */
    public Row2ColModelPro(Class clazzT, String[] groupFields, String[] groupFieldsAsName, String[] row2colsKeyFields, Map<String,String>[] row2colsKeyFieldsDict, String[]  newColsValueByFields, String[] newColsValueUnitSymboles){
//        Type types=this.getClass().getGenericSuperclass();
//        Type[] genericType=((ParameterizedType)types).getActualTypeArguments();
//        this.clazzT=(Class<T>) genericType[0];
//        this.clazzT = (Class <T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        this.clazzT = clazzT;
        this.groupFields = groupFields;
        this.groupFieldsAsName = groupFieldsAsName;
        this.row2colsKeyFields = row2colsKeyFields;
        this.row2colsKeyFieldsDict = row2colsKeyFieldsDict;
        this.newColsValueByFields = newColsValueByFields;
        this.newColsValueUnitSymboles =  newColsValueUnitSymboles;
//        this.groupCalculationFun = null ;
//        this.groupCalculationAsColName = null;
//        this.newValueWeightCoefficientFieldes = null;
//        this.newWeightCoefficientAsColName = null;

    }

    /**
     *
     * @param clazzT 类型
     * @param groupFields 固定分组属性名称
     * @param groupFieldsAsName 固定分组属性显示别名
     * @param row2colsKeyFields  行转列动态列对应的关键属性字段，例如：科目字段（值是=语文 英语 数学）
     * @param newColsValueByFields 行转列动态列对应的值字段，允许空：例如：成绩字段（值是=98.5 99 59.5）
     * @param newColsValueUnitSymboles 动态列对应的单位符号，允许空，例如：“%” “人” “个”等
     * @param groupCalculationFun  聚聚合计算函数，支持[sum,count,max,min]不区分大小写
     * @param groupCalculationFunForValueField 聚合函数作用字段
     * @param groupCalculationAsColName 计算值列名字符串=列名+字符串，值=“Calculation”，所得列名=“语文Calculation”
     */
    public Row2ColModelPro(Class clazzT, String[] groupFields, String[] groupFieldsAsName, String[] row2colsKeyFields, Map<String,String>[] row2colsKeyFieldsDict, String[]  newColsValueByFields, String[] newColsValueUnitSymboles, String[] groupCalculationFun, String[] groupCalculationFunForValueField, String[][] groupCalculationAsColName ){
//        Type types=this.getClass().getGenericSuperclass();
//        Type[] genericType=((ParameterizedType)types).getActualTypeArguments();
//        this.clazzT=(Class<T>) genericType[0];
//        this.clazzT = (Class <T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        this.clazzT = clazzT;
        this.groupFields = groupFields;
        this.groupFieldsAsName = groupFieldsAsName;
        this.row2colsKeyFields = row2colsKeyFields;
        this.row2colsKeyFieldsDict = row2colsKeyFieldsDict;
        this.newColsValueByFields = newColsValueByFields;
        this.newColsValueUnitSymboles = newColsValueUnitSymboles;
//        this.groupCalculationFun = groupCalculationFun ;
//        this.groupCalculationFunForValueField = groupCalculationFunForValueField;
//        this.groupCalculationAsColName =groupCalculationAsColName;
//        this.newValueWeightCoefficientFieldes = null;
//        this.newWeightCoefficientAsColName = null;

    }

    /**
     *
     * @param clazzT 类型
     * @param groupFields 固定分组属性名称
     * @param groupFieldsAsName 固定分组属性显示别名
     * @param row2colsKeyFields  行转列动态列对应的关键属性字段，例如：科目字段（值是=语文 英语 数学）
     * @param newColsValueByFields 行转列动态列对应的值字段，允许空：例如：成绩字段（值是=98.5 99 59.5）
     * @param newColsValueUnitSymboles 动态列对应的单位符号，允许空，例如：“%” “人” “个”等
     * @param groupCalculationFun  聚聚合计算函数，支持[sum,count,max,min]不区分大小写
     * @param groupCalculationFunForValueField 聚合函数作用字段
     * @param groupCalculationAsColName 计算值列名字符串=列名+字符串，值=“Calculation”，所得列名=“语文Calculation”
     * @param newValueWeightCoefficientFieldes 权重列名字符串，值=“WeightCoeff”，所得列名=“语文WeightCoeff”
     */
    public Row2ColModelPro(Class clazzT, String[] groupFields, String[] groupFieldsAsName, String[] row2colsKeyFields, Map<String,String>[] row2colsKeyFieldsDict, String[]  newColsValueByFields, String[] newColsValueUnitSymboles, String[] groupCalculationFun, String[] groupCalculationFunForValueField, String[][] groupCalculationAsColName, String newValueWeightCoefficientFieldes, String newWeightCoefficientAsColName ){
//        Type types=this.getClass().getGenericSuperclass();
//        Type[] genericType=((ParameterizedType)types).getActualTypeArguments();
//        this.clazzT=(Class<T>) genericType[0];
        this.clazzT = clazzT;
        this.groupFields = groupFields;
        this.groupFieldsAsName = groupFieldsAsName;
        this.row2colsKeyFields = row2colsKeyFields;
        this.row2colsKeyFieldsDict = row2colsKeyFieldsDict;
        this.newColsValueByFields = newColsValueByFields;
        this.newColsValueUnitSymboles = newColsValueUnitSymboles;
//        this.groupCalculationFun = groupCalculationFun ;
//        this.groupCalculationFunForValueField = groupCalculationFunForValueField;
//        this.groupCalculationAsColName =groupCalculationAsColName;
//        this.newValueWeightCoefficientFieldes = newValueWeightCoefficientFieldes;
//        this.newWeightCoefficientAsColName = newWeightCoefficientAsColName;

    }

}

